package com.mlethe.library.multi.api.entity;

import android.text.TextUtils;

import com.mlethe.library.multi.api.Share;

import java.util.ArrayList;
import java.util.List;

/**
 * 音乐分享实体(仅支持微信、QQ)
 *
 * @author Mlethe
 */
public final class ShareMusic extends Share {
    /**
     * 音频数据的 URL 地址（音乐文件的url）
     */
    private String musicUrl;
    /**
     * 歌手名（微信）
     */
    private String singerName;
    /**
     * 歌曲时长(单位：毫秒)（微信）
     */
    private int duration;
    /**
     * 歌词（微信）
     */
    private String songLyric;
    /**
     * 微信：高清专辑图本地文件路径
     * QQ：图片
     */
    private List<ImageObject> thumbImages;
    /**
     * 高清专辑封面图sha256（微信）
     */
    private String thumbFileHash;
    /**
     * 音乐专辑名（微信）
     */
    private String albumName;
    /**
     * 音乐流派（微信）
     */
    private String musicGenre;
    /**
     * 发行时间Unix时间戳（单位：秒）（微信）
     */
    private long issueDate;
    /**
     * 音乐标识符（微信）
     * 建议填写，用户在微信音乐播放器跳回应用时会携带该参数，可用于唯一标识一首歌，微信侧不理解
     */
    private String identification;

    /**
     * @param musicUrl 音乐文件的url
     * @param targetUrl 音频网页的 URL 地址
     */
    public ShareMusic(String musicUrl, String targetUrl) {
        this.musicUrl = musicUrl;
        setTargetUrl(targetUrl);
    }

    /**
     * 获取音频数据的 URL 地址（音乐文件的url）
     */
    public String getMusicUrl() {
        return musicUrl;
    }

    /**
     * 获取歌手名（微信）
     */
    public String getSingerName() {
        return singerName;
    }

    /**
     * 设置歌手名（微信：必填）
     *
     * @param singerName 歌手名
     */
    public ShareMusic setSingerName(String singerName) {
        this.singerName = singerName;
        return this;
    }

    /**
     * 获取歌曲时长(单位：毫秒)（微信）
     */
    public int getDuration() {
        return duration;
    }

    /**
     * 设置歌曲时长（微信：必填）
     *
     * @param duration 单位：毫秒
     */
    public ShareMusic setDuration(int duration) {
        this.duration = duration;
        return this;
    }

    /**
     * 获取歌词
     */
    public String getSongLyric() {
        return songLyric;
    }

    /**
     * 设置歌词
     *
     * @param songLyric 歌词
     */
    public ShareMusic setSongLyric(String songLyric) {
        this.songLyric = songLyric;
        return this;
    }

    /**
     * 获取高清专辑图、分享的图片列表
     */
    public List<ImageObject> getThumbImages() {
        return thumbImages;
    }

    /**
     * 添加高清专辑图、分享的图片
     *
     * @param image 图片
     */
    public ShareMusic addThumbImage(ImageObject image) {
        if (this.thumbImages == null) {
            this.thumbImages = new ArrayList<>();
        }
        this.thumbImages.add(image);
        return this;
    }

    /**
     * 获取高清专辑封面图sha256
     */
    public String getThumbFileHash() {
        return thumbFileHash;
    }

    /**
     * 设置高清专辑封面图sha256
     *
     * @param thumbFileHash 高清专辑封面图sha256
     */
    public ShareMusic setThumbFileHash(String thumbFileHash) {
        this.thumbFileHash = thumbFileHash;
        return this;
    }

    /**
     * 获取音乐专辑名
     */
    public String getAlbumName() {
        return albumName;
    }

    /**
     * 设置音乐专辑名
     *
     * @param albumName 音乐专辑名
     */
    public ShareMusic setAlbumName(String albumName) {
        this.albumName = albumName;
        return this;
    }

    /**
     * 获取音乐流派
     */
    public String getMusicGenre() {
        return musicGenre;
    }

    /**
     * 设置音乐流派
     *
     * @param musicGenre 音乐流派
     */
    public ShareMusic setMusicGenre(String musicGenre) {
        this.musicGenre = musicGenre;
        return this;
    }

    /**
     * 获取发行时间Unix时间戳
     */
    public long getIssueDate() {
        return issueDate;
    }

    /**
     * 设置发行时间Unix时间戳
     *
     * @param issueDate 单位：秒
     */
    public ShareMusic setIssueDate(long issueDate) {
        this.issueDate = issueDate;
        return this;
    }

    /**
     * 获取音乐标识符
     */
    public String getIdentification() {
        return identification;
    }

    /**
     * 设置音乐标识符
     *
     * @param identification 建议填写，用户在微信音乐播放器跳回应用时会携带该参数，可用于唯一标识一首歌，微信侧不理解
     */
    public ShareMusic setIdentification(String identification) {
        this.identification = identification;
        return this;
    }

    @Override
    public boolean isValid() {
        return !TextUtils.isEmpty(getTitle()) && !TextUtils.isEmpty(musicUrl) && !TextUtils.isEmpty(getTargetUrl());
    }

    @Override
    protected void release() {
        super.release();
        musicUrl = null;
        singerName = null;
        duration = 0;
        songLyric = null;
        if (thumbImages != null) {
            for (ImageObject image : thumbImages) {
                image.release();
            }
        }
        thumbImages = null;
        thumbFileHash = null;
        albumName = null;
        musicGenre = null;
        issueDate = 0;
        identification = null;
    }
}
